﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>




void test1(int(*p)[5], int r, int c)
{
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			printf("%d ", *(*(p + i) + j));//p[i][j]
		}
		printf("\n");
	}

}
int main(void)
{
	{
		//*(arr+i)<==>arr[i]
		//*&相互抵消
		//数组指针解引用两次（arr本身就是地址，再取地址）才能访问元素
		int arr[10] = { 1,2,3,4,5,6,7,8,9 };
		int(*p)[10] = &arr;
		char ch = 'a';
		char* pa = &ch;
		*pa = 'b';
		//用 *p 解引用时，你实际上得到了整个数组 arr 的首地址。
		for (int i = 0; i < 10; i++)
		{
			printf("%d ", *((*p) + i));
			//printf("%d ", (*p)[i]);
		}
		printf("\n");
	}
	{
		/*
			⼆维数组的数组名表⽰的就是第⼀⾏的地址，是⼀维数组的地址
			⼆维数组传参本质上也是传递了地址，传递的是第⼀⾏这个⼀维数组的地址，那么形参也是可以写成指针形式的
		*/
		int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
		void (*ptr)(int* [5], int, int) = test1;//&test1
		(*ptr)(arr, 3, 5);
		ptr(arr, 3, 5);
	}
	{
		(*(void (*)(void))0)();					//函数调用，调用0地址处放的那个函数
		void (*signal(int, void(*)(int)))(int);	//函数声明，返回类型必须要指明
	}
	return 0;
}

